
// 总共有三个类修饰符： public(默认)  private  和 protected

// 创建Person类
// class Person {
//     name: '张三'
//     age: 18
//     say() {
//         console.log('我的名字是：' + this.name + ",我的年龄是：" + this.age)
//     }
// }

// // 创建Person的实例
// var p = new Person()
// p.say()
// console.log(p.name) // 当一个类成员变量没有修饰的时候，外界是可以进行访问的，默认就是public修饰


// 假设name不允许外部访问，那么就可以使用private修饰符
class Person {
    private name: '张三'
    protected age: 18
    hobby: '篮球'
    say() {
        console.log('我的名字是：' + this.name + ",我的年龄是：" + this.age)
    }
}
var p = new Person()
p.say()
// private属性只能在类的内部进行访问
// console.log(p.name) 
// protected属性只能在类的内部和子类中进行访问
// console.log(p.age)



// 创建Child子类
class Child extends Person {
    callParent() {
        // super关键字可以调用父类的方法
        super.say()
    }
    static test() {
        console.log('test')
        // console.log(this.hobby) // 类的静态方法里面是不允许使用this的
    }
}

var d = new Child()
d.callParent()
// 因为子类继承了父类，虽然子类中没有hobby属性，但是子类可以访问父类中的public属性和方法
console.log(d.hobby)
console.log(d.say())
// console.log(d.name) // 因为name是private属性，所以子类无法访问父类中的private属性
// console.log(d.age) // 因为age是protected属性，所以子类无法访问父类中的protected属性

// 总结：子类继承了父类，但是没有办法访问父类中私有的和受保护的属性



// 静态属性和方法
// 静态属性和方法只能通过类名进行访问，不能通过实例进行访问
console.log(Child.test())
// console.log(d.test()) // 因为test方法是静态方法，所以不能通过实例进行访问
console.log(d.say()) // 因为say方法是实例方法，所以可以通过实例进行访问
// console.log(Child.say()) // 因为say方法是实例方法，所以不能通过类名进行访问

// 记住： 类的静态方法里面是不允许使用this的